#include <algorithm>
#include <iostream>
#include <queue>
#include <unordered_map>
using namespace std;
int dx[4] = { -1, 0, 1, 0 }, dy[4] = { 0, 1, 0, -1 };
int bfs(string state) {
    queue<string> q;
    unordered_map<string, int> d;
    d[state] = 0;              //起始状态交换了0次
    string end = "12345678x";  //目标情况
    q.push(state);             //把起始状态放进队列
    while (q.size()) {
        string t = q.front();
        q.pop();
        int distance = d[t];
        if (t == end) return distance;  //当到了最后的状态，就返回次数
        int k = t.find('x');            //把x的位置找到
        int x = k / 3, y = k % 3;  // x的二维坐标的位置，一维和二维之间的相互转变
        for (int i = 0; i < 4; i++) {
            int a = x + dx[i], b = y + dy[i];  //对x与邻接的数字进行交换
            if (a >= 0 && a < 3 && b >= 0 && b < 3) {
                swap(t[a * 3 + b], t[k]);
                if (!d.count(t)) {  //这种状态之前没遇见过的话，才会放到队列
                    d[t] = distance + 1;  //交换次数+1
                    q.push(t);   //放进队列，等待下一次的判断
                }
                swap(t[a * 3 + b], t[k]);  //恢复到原来的状态，因为还要与别的临接数字进行交换
            }
        }
    }
    return -1;
}
int main() {
    char s[2];
    string state;
    for (int i = 0; i < 9; i++) {
        cin >> s;
        state += *s;
    }
    printf("%d\n", bfs(state));
    return 0;
}